//package project;
//
//import java.awt.Dimension;
//import java.awt.Graphics2D;
//import java.awt.Image;
//import java.awt.RenderingHints;
//import java.awt.image.BufferedImage;
//import java.io.BufferedReader;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.io.OutputStreamWriter;
//import java.io.PrintStream;
//import java.text.DateFormat;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Random;
//import javax.swing.ImageIcon;
//
//public class IMatDataHandler
//{
//  private static IMatDataHandler instance = null;
//  private ArrayList<Product> products;
//  private ArrayList<Order> orders;
//  private CreditCard creditCard;
//  private Customer customer;
//  private User user;
//  private ShoppingCart shoppingCart;
//  private final String DIRECTORY = ".dat215";
//  private final String IMAT_DIRECTORY = "imat";
//  private final String IMAGE_DIRECTORY = "images";
//  private final String ORDER_DIRECTORY = "orders";
//  private final String PRODUCTS_FILE_NAME = "products.txt";
//  private final String CUSTOMER_FILE_NAME = "customer.txt";
//  private final String USER_FILE_NAME = "user.txt";
//  private final String CREDITCARD_FILE_NAME = "creditcard.txt";
//  private final String PREFS_FILE_NAME = "prefs.txt";
//  private final String SHOPPINGCART_FILE_NAME = "shoppingcart.txt";
//  private final String SPLIT = ";";
//  private String path = "";
//  private int latestOrderNbr = 0;
//  private boolean firstRun = true;
//  private boolean firstRunReset = false;
//  private Random randomizer;
//  private static final DateFormat orderDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//
//  public static IMatDataHandler getInstance()
//  {
//    if (instance == null) {
//      instance = new IMatDataHandler();
//      instance.init();
//    }
//    return instance;
//  }
//
//  private void init() {
//    this.products = new ArrayList();
//    this.orders = new ArrayList();
//    this.creditCard = CreditCard.getInstance();
//    this.customer = Customer.getInstance();
//    this.user = User.getInstance();
//    this.shoppingCart = ShoppingCart.getInstance();
//    this.randomizer = new Random();
//
//    verifyDirectories();
//    loadProducts();
//    loadCustomer();
//    loadUser();
//    loadCreditCard();
//    loadPreferences();
//    loadOrders();
//    loadShoppingCart();
//  }
//
//  public void shutDown()
//  {
//    saveProducts();
//    saveCustomer();
//    saveUser();
//    saveCreditCard();
//    savePreferences();
//    saveOrders();
//    saveShoppingCart();
//  }
//
//  public boolean isFirstRun()
//  {
//    return this.firstRun;
//  }
//
//  public void resetFirstRun()
//  {
//    this.firstRun = true;
//    this.firstRunReset = true;
//  }
//
//  public boolean isUserComplete()
//  {
//    return (!this.customer.getFirstName().equals("")) && (!this.customer.getLastName().equals("")) && (((!this.customer.getPhoneNumber().equals("")) || (!this.customer.getMobilePhoneNumber().equals("")))) && (!this.customer.getAddress().equals("")) && (!this.customer.getPostCode().equals("")) && (!this.customer.getPostAddress().equals(""));
//  }
//
//  public void reset()
//  {
//  }
//
//  public Customer getCustomer()
//  {
//    return this.customer;
//  }
//
//  public User getUser()
//  {
//    return this.user;
//  }
//
//  public CreditCard getCreditCard()
//  {
//    return this.creditCard;
//  }
//
//  public ShoppingCart getShoppingCart()
//  {
//    return this.shoppingCart;
//  }
//
//  public Order placeOrder()
//  {
//    return placeOrder(true);
//  }
//
//  public Order placeOrder(boolean clearShoppingCart)
//  {
//    Order order = new Order();
//
//    List items = new ArrayList(this.shoppingCart.getItems());
//
//    order.setOrderNumber(newOrderNbr());
//    order.setDate(new Date());
//    order.setItems(items);
//
//    this.orders.add(order);
//
//    if (clearShoppingCart) {
//      this.shoppingCart.clear();
//    }
//    return order;
//  }
//
//  public List<Order> getOrders()
//  {
//    return this.orders;
//  }
//
//  public Product getProduct(int idNbr)
//  {
//    for (Product p : this.products) {
//      if (p.getProductId() == idNbr) {
//        return p;
//      }
//    }
//    return null;
//  }
//
//  public List<Product> getProducts()
//  {
//    return this.products;
//  }
//
//  public List<Product> getProducts(ProductCategory pc)
//  {
//    ArrayList result = new ArrayList();
//
//    for (Product p : this.products) {
//      if (p.getCategory().equals(pc)) {
//        result.add(p);
//      }
//    }
//    return result;
//  }
//
//  public List<Product> findProducts(String s)
//  {
//    String lowS = s.toLowerCase();
//    ArrayList result = new ArrayList();
//
//    for (Product p : this.products) {
//      String productName = p.getName().toLowerCase();
//
//      if (productName.indexOf(lowS) > -1) {
//        result.add(p);
//      }
//    }
//    return result;
//  }
//
//  public void addProduct(Product p)
//  {
//    this.products.add(p);
//  }
//
//  public void removeProduct(Product p)
//  {
//    this.products.remove(p);
//  }
//
//  public boolean hasImage(Product p)
//  {
//    return !p.getImageName().equals("");
//  }
//
//  public ImageIcon getImageIcon(Product p)
//  {
//    if (!hasImage(p)) {
//      return null;
//    }
//    try
//    {
//      ImageIcon ic = new ImageIcon(getImagePath(p));
//
//      return ic;
//    } catch (Exception e) {
//      System.out.println("Error loading image for product: " + p.getProductId());
//    }return null;
//  }
//
//  public ImageIcon getImageIcon(Product p, Dimension d)
//  {
//    return getImageIcon(p, d.width, d.height);
//  }
//
//  public ImageIcon getImageIcon(Product p, int width, int height)
//  {
//    if (!hasImage(p)) {
//      return null;
//    }
//    try
//    {
//      ImageIcon ic = new ImageIcon(getImagePath(p));
//      ic = new ImageIcon(getScaledImage(ic.getImage(), width, height));
//
//      return ic;
//    } catch (Exception e) {
//      System.out.println("Error loading image for product: " + p.getProductId());
//    }return null;
//  }
//
//  public void setProductImage(Product p, File f)
//  {
//    if (p == null)
//      return;
//    try {
//      String filename = f.getCanonicalPath();
//      String extension = IOUtilities.getFileExtension(filename);
//
//      String imageName = "product_" + p.getProductId() + extension;
//
//      String newfile = imageDirectory() + File.separatorChar + imageName;
//
//      IOUtilities.copy(filename, newfile, true);
//
//      p.setImageName(imageName);
//    } catch (Exception e) {
//      System.out.println("error in IMatDataHAndler: setProductImage");
//      e.printStackTrace();
//    }
//  }
//
//  private void loadProducts()
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(productsFile()), "ISO-8859-1"));
//
//      System.out.println("loadProducts, starting...");
//
//      while ((line = reader.readLine()) != null)
//      {
//        String line;
//        parseProductLine(line);
//      }
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void parseProductLine(String line)
//  {
//    String[] tokens = line.split(";");
//
//    if (tokens.length == 7) {
//      Product p = new Product();
//
//      p.setProductId(Integer.parseInt(tokens[0]));
//      p.setCategory(ProductCategory.valueOf(tokens[1]));
//      p.setName(tokens[2]);
//      p.setPrice(Double.parseDouble(tokens[3]));
//      p.setUnit(tokens[4]);
//      p.setImageName(tokens[5]);
//
//      this.products.add(p);
//    } else {
//      System.out.println("iMatDataHandler products file, invalid line: " + line);
//    }
//  }
//
//  private void loadCustomer()
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(customerFile()), "ISO-8859-1"));
//
//      System.out.println("loadCustomer, starting...");
//
//      while ((line = reader.readLine()) != null)
//      {
//        String line;
//        parseCustomerLine(line);
//      }
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void parseCustomerLine(String line)
//  {
//    String[] tokens = line.split(";");
//
//    if (tokens.length == 9)
//    {
//      this.customer.setFirstName(tokens[0]);
//      this.customer.setLastName(tokens[1]);
//      this.customer.setPhoneNumber(tokens[2]);
//      this.customer.setMobilePhoneNumber(tokens[3]);
//      this.customer.setEmail(tokens[4]);
//      this.customer.setAddress(tokens[5]);
//      this.customer.setPostCode(tokens[6]);
//      this.customer.setPostAddress(tokens[7]);
//    }
//    else {
//      System.out.println("iMatDataHandler customer file, invalid line: " + line);
//    }
//  }
//
//  private void loadUser()
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(userFile()), "ISO-8859-1"));
//
//      System.out.println("loadUser, starting...");
//
//      String line = reader.readLine();
//
//      if (line != null)
//      {
//        this.user.setUserName(line);
//
//        line = reader.readLine();
//
//        if (line != null)
//        {
//          this.user.setPassword(line);
//        }
//      }
//
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void loadCreditCard()
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(creditCardFile()), "ISO-8859-1"));
//
//      System.out.println("loadCreditCard, starting...");
//
//      while ((line = reader.readLine()) != null)
//      {
//        String line;
//        parseCreditCardLine(line);
//      }
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void parseCreditCardLine(String line)
//  {
//    String[] tokens = line.split(";");
//
//    if (tokens.length == 7)
//    {
//      this.creditCard.setCardType(tokens[0]);
//      this.creditCard.setHoldersName(tokens[1]);
//      this.creditCard.setValidMonth(Integer.parseInt(tokens[2]));
//      this.creditCard.setValidYear(Integer.parseInt(tokens[3]));
//      this.creditCard.setCardNumber(tokens[4]);
//      this.creditCard.setVerificationCode(Integer.parseInt(tokens[5]));
//    }
//    else {
//      System.out.println("iMatDataHandler creditcard file, invalid line: " + line);
//    }
//  }
//
//  private void loadPreferences()
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(preferencesFile()), "ISO-8859-1"));
//
//      System.out.println("loadPreferences, starting...");
//
//      while ((line = reader.readLine()) != null)
//      {
//        String line;
//        parsePreferencesLine(line);
//      }
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void parsePreferencesLine(String line)
//  {
//    String[] tokens = line.split(";");
//
//    if (tokens.length == 3)
//    {
//      this.latestOrderNbr = Integer.parseInt(tokens[0]);
//      this.firstRun = Boolean.parseBoolean(tokens[1]);
//    }
//    else {
//      System.out.println("iMatDataHandler preferences file, invalid line: " + line);
//    }
//  }
//
//  private void loadOrders() {
//    File orderDir = new File(orderDirectory());
//
//    if (!orderDir.isDirectory())
//      return;
//    File[] files = orderDir.listFiles();
//
//    for (int i = 0; i < files.length; ++i) {
//      File thisFile = files[i];
//
//      if ((thisFile.isHidden()) || 
//        (!thisFile.getName().endsWith(".txt"))) continue;
//      loadOrder(thisFile);
//    }
//  }
//
//  private void loadOrder(File f)
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "ISO-8859-1"));
//
//      Order order = new Order();
//      List items = new ArrayList();
//      String line;
//      if ((line = reader.readLine()) != null) {
//        order.setOrderNumber(Integer.parseInt(line));
//        this.orders.add(order);
//      }
//      if ((line = reader.readLine()) != null) {
//        Date d;
//        try {
//          d = orderDateFormat.parse(line);
//        }
//        catch (Exception e) {
//          d = new Date();
//        }
//        order.setDate(d);
//      }
//      while ((line = reader.readLine()) != null)
//      {
//        String[] tokens = line.split(";");
//        if (tokens.length == 2) {
//          Product p = getProduct(Integer.parseInt(tokens[0]));
//          double amount = Double.parseDouble(tokens[1]);
//
//          ShoppingItem sci = new ShoppingItem(p, amount);
//          items.add(sci);
//        }
//      }
//
//      order.setItems(items);
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void loadShoppingCart()
//  {
//    try
//    {
//      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(shoppingCartFile()), "ISO-8859-1"));
//
//      System.out.println("loadShoppingCart, starting...");
//
//      while ((line = reader.readLine()) != null)
//      {
//        String line;
//        parseShoppingCartLine(line);
//      }
//      reader.close();
//    } catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void parseShoppingCartLine(String line)
//  {
//    String[] tokens = line.split(";");
//
//    if (tokens.length == 2) {
//      Product p = getProduct(Integer.parseInt(tokens[0]));
//      double amount = Double.parseDouble(tokens[1]);
//
//      ShoppingItem sci = new ShoppingItem(p, amount);
//
//      this.shoppingCart.addItem(sci);
//    } else {
//      System.out.println("iMatDataHandler shopping cart file, invalid line: " + line);
//    }
//  }
//
//  private void saveProducts() {
//    try {
//      FileOutputStream fos = new FileOutputStream(productsFile());
//
//      OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//      System.out.println("saveProducts()");
//
//      for (Product p : this.products) {
//        String line = "";
//
//        line = p.getProductId() + ";" + p.getCategory() + ";" + p.getName() + ";" + p.getPrice() + ";" + p.getUnit() + ";" + p.getImageName() + ";" + "end\n";
//
//        osw.write(line);
//      }
//
//      osw.flush();
//
//      osw.close();
//    }
//    catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void saveCustomer() {
//    try {
//      FileOutputStream fos = new FileOutputStream(customerFile());
//
//      OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//      System.out.println("saveCustomer()");
//
//      String line = "";
//
//      line = this.customer.getFirstName() + ";" + this.customer.getLastName() + ";" + this.customer.getPhoneNumber() + ";" + this.customer.getMobilePhoneNumber() + ";" + this.customer.getEmail() + ";" + this.customer.getAddress() + ";" + this.customer.getPostCode() + ";" + this.customer.getPostAddress() + ";" + "end\n";
//
//      osw.write(line);
//
//      osw.flush();
//
//      osw.close();
//    }
//    catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void saveUser() {
//    try {
//      FileOutputStream fos = new FileOutputStream(userFile());
//
//      OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//      System.out.println("saveUser()");
//
//      String line = "";
//
//      line = this.user.getUserName() + "\n";
//
//      osw.write(line);
//
//      line = this.user.getPassword() + "\n";
//
//      osw.write(line);
//
//      osw.flush();
//
//      osw.close();
//    }
//    catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void saveCreditCard() {
//    try {
//      FileOutputStream fos = new FileOutputStream(creditCardFile());
//
//      OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//      System.out.println("saveCreditCard()");
//
//      String line = "";
//
//      line = this.creditCard.getCardType() + ";" + this.creditCard.getHoldersName() + ";" + this.creditCard.getValidMonth() + ";" + this.creditCard.getValidYear() + ";" + this.creditCard.getCardNumber() + ";" + this.creditCard.getVerificationCode() + ";" + "end\n";
//
//      osw.write(line);
//
//      osw.flush();
//
//      osw.close();
//    }
//    catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void savePreferences() {
//    try {
//      FileOutputStream fos = new FileOutputStream(preferencesFile());
//
//      OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//      System.out.println("savePreferences()");
//
//      String line = "";
//
//      line = "" + this.latestOrderNbr + ";" + ((this.firstRunReset) ? "true" : "false") + ";" + "end\n";
//
//      osw.write(line);
//
//      osw.flush();
//
//      osw.close();
//    }
//    catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void saveOrders() {
//    System.out.println("saveOrders()");
//
//    for (Order order : this.orders) {
//      String filename = orderDirectory() + File.separatorChar + "order_" + order.getOrderNumber() + ".txt";
//      try
//      {
//        FileOutputStream fos = new FileOutputStream(filename);
//
//        OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//        String line = "";
//
//        line = "" + order.getOrderNumber() + "\n";
//        osw.write(line);
//
//        line = "" + orderDateFormat.format(order.getDate()) + "\n";
//        osw.write(line);
//
//        List items = order.getItems();
//
//        for (ShoppingItem item : items) {
//          line = "" + item.getProduct().getProductId() + ";" + item.getAmount() + "\n";
//          osw.write(line);
//        }
//
//        osw.flush();
//
//        osw.close();
//      }
//      catch (IOException exc) {
//        exc.printStackTrace();
//      }
//    }
//  }
//
//  private void saveShoppingCart() {
//    try {
//      FileOutputStream fos = new FileOutputStream(shoppingCartFile());
//
//      OutputStreamWriter osw = new OutputStreamWriter(fos, "ISO-8859-1");
//
//      System.out.println("saveShoppingCart()");
//
//      String line = "";
//      List items = this.shoppingCart.getItems();
//
//      for (ShoppingItem sci : items)
//      {
//        line = "" + sci.getProduct().getProductId() + ";" + sci.getAmount() + "\n";
//
//        osw.write(line);
//      }
//
//      osw.flush();
//
//      osw.close();
//    }
//    catch (IOException exc) {
//      exc.printStackTrace();
//    }
//  }
//
//  private void verifyDirectories()
//  {
//    File directory;
//    try
//    {
//      directory = new File(courseDirectory());
//      if (!directory.exists())
//        directory.mkdir();
//    }
//    catch (Exception ex)
//    {
//      System.out.println("iMatDataHandler creating course directory: " + ex);
//    }
//    try
//    {
//      directory = new File(imatDirectory());
//      if (!directory.exists())
//        directory.mkdir();
//    }
//    catch (Exception ex)
//    {
//      System.out.println("iMatDataHandler creating imat directory: " + ex);
//    }
//    try
//    {
//      directory = new File(imageDirectory());
//      if (!directory.exists())
//        directory.mkdir();
//    }
//    catch (Exception ex)
//    {
//      System.out.println("iMatDataHandler creating image directory: " + ex);
//    }
//    try
//    {
//      directory = new File(orderDirectory());
//      if (!directory.exists())
//        directory.mkdir();
//    }
//    catch (Exception ex)
//    {
//      System.out.println("iMatDataHandler creating order directory: " + ex);
//    }
//  }
//
//  private String courseDirectory()
//  {
//    return System.getProperty("user.home") + File.separatorChar + ".dat215";
//  }
//
//  public String imatDirectory()
//  {
//    return courseDirectory() + File.separatorChar + "imat";
//  }
//
//  private String productsFile() {
//    return imatDirectory() + File.separatorChar + "products.txt";
//  }
//
//  private String customerFile() {
//    return imatDirectory() + File.separatorChar + "customer.txt";
//  }
//
//  private String userFile() {
//    return imatDirectory() + File.separatorChar + "user.txt";
//  }
//
//  private String creditCardFile() {
//    return imatDirectory() + File.separatorChar + "creditcard.txt";
//  }
//
//  private String preferencesFile() {
//    return imatDirectory() + File.separatorChar + "prefs.txt";
//  }
//
//  private String shoppingCartFile() {
//    return imatDirectory() + File.separatorChar + "shoppingcart.txt";
//  }
//
//  private String imageDirectory() {
//    return imatDirectory() + File.separatorChar + "images";
//  }
//
//  private String orderDirectory() {
//    return imatDirectory() + File.separatorChar + "orders";
//  }
//
//  private String getImagePath(Product p) {
//    return imageDirectory() + File.separatorChar + p.getImageName();
//  }
//
//  private int newOrderNbr()
//  {
//    int newOrderNbr = this.latestOrderNbr + 1 + this.randomizer.nextInt(15);
//    this.latestOrderNbr = newOrderNbr;
//
//    return newOrderNbr;
//  }
//
//  private Image getScaledImage(Image srcImg, int w, int h)
//  {
//    BufferedImage resizedImg = new BufferedImage(w, h, 1);
//    Graphics2D g2 = resizedImg.createGraphics();
//    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//    g2.drawImage(srcImg, 0, 0, w, h, null);
//    g2.dispose();
//    return resizedImg;
//  }
//}